operatori:

OR / AND / XOR
i tre operatori funzionano come gli operatori logici solo che agiscono sul singolo bit

AND &
solo se entrambi i bit sono 1 uguale a 1
nella funzione booleana prodotto logico (AND) comanda lo zero logico; é sufficiente che uno dei due operandi valga zero per avere come risultato zero (esattamente come nel prodotto aritmetico)

int a = 147; 1 0 0 1 0 0 1 1
int b = 97; 0 1 1 0 0 0 0 1
int c = a&b; = 1 0 0 0 0 0 0 0 1


OR |
se uno dei due bit o entrambi é 1 allora uguale a 1
int a = 147; 1 0 0 1 0 0 1 1
int b = 97; 0 1 1 0 0 0 0 1
int c = a|b; = 243 1 1 1 1 0 0 1 1


XOR ^
come OR ma se entrambi sono 1 allora uguale 0
int a = 147; 1 0 0 1 0 0 1 1
int b = 97; 0 1 1 0 0 0 0 1
int c = a^b; = 232 1 1 1 1 0 0 1 0


scorrimenti (shift)
l'operatore fa scorrere a destra o sinistra i bit di un numero di posizioni specificato.

scorrimento sinistra <<
saranno aggiunti dei 0 nei posti vuoti a destra, i bit usciti andranno persi.
int a = 42; 0 0 1 0 1 0 1 0
int c = a<<1 = 84 0 1 0 1 0 1 0 0


scorrimento destra >>
saranno aggiunti dei 0 o 1 nei posti vuoti a sinistra a seconda se valore del primo bit sia 0 o 1, i bit usciti andranno persi.
caso con 0 (aggiunta di bit 0 a sinistra)
int a = 43; 0 0 1 0 1 0 1 1
int c = a>>0 = 21 0 0 0 1 0 1 0 1

caso con 1 (aggiunta di bit 1 a sinistra)
int a = -86; 1 0 1 0 1 0 1 0
int c = a>>1 = -43 1 1 0 1 0 1 0 1

funziona così per mantenere lo stesso segno del valore dopo lo scorrimento, il primo bit indica il segno (modulo 2)

se si vuole fare uno scorrimento a destra di un valore negativo, quindi con il primo bit 1, ed obbligare il computer ad inserire bit 0 invece che 1 all'inizio del byte, bisogna indicare la variabile come unsigned, così il primo bit non indicherà più il segno come previsto dal modulo 2, ma un valore


complemento a uno
inverte i bit, ovvero trasforma gli 1 in 0 e gli 0 in 1
i = 10; 0 0 0 0 1 0 1 0
j = ~i; = 245 1 1 1 1 0 1 0 1